
class Emitter {
    #map = new Map();
    constructor(){
        console.log( this.#map );
    }
    on( name, listener ) {
        // 先尝试获得指定事件名称对应的监听器数组
        let listeners = this.#map.get(name);
        // 若成功获取到监听器数组
        if( listeners ) {
            // 则在监听器数组末尾追加新的监听器
            listeners.push(listener);
            return;
        }
        // 若未能获取到监听器数组，则向 map 中添加新的映射
        this.#map.set( name, [listener] );
    }
    emit(name, payload){
        // 先尝试获得指定事件名称对应的监听器数组
        let listeners = this.#map.get(name);
        if( listeners ){
            listeners.forEach( fn => fn(payload) );
        }
    }
    off(name) {
        if( this.#map.has( name ) ) {
            this.#map.delete(name);
        }
    }
    toString() {
        return this.#map.entries();
    }
}


const $bus = new Emitter();

$bus.on( '着火', () => console.log(`大家都来灭火了`) );
$bus.emit( '着火' );
$bus.off( '着火' );

$bus.on( '着火', name => console.log(`${name}来灭火了`) );
$bus.emit( '着火', '王某然' );
$bus.off( '着火' );

$bus.on( '着火', person => {
    let gender = person.gender == '男' ? '先生' : person.gender == '女' ? '女士' : '';
    console.log( `${person.name}${gender}来灭火了`);
});
$bus.emit( '着火', { name: '谢某然', gender: '男' } );
$bus.off( '着火' );

$bus.emit( '着火', '太上老君' );
